package main

import "fmt"

func printSlice(s []int) {
	//_表示匿名的变量
	for _, value := range s {
		fmt.Println(value)
	}
	//可以修改切片的值
	s[0] = 100
}

func printSliceInfo(s []int) {
	fmt.Printf("len = %d, cap = %d, slice = %v\n", len(s), cap(s), s)
}
func goSlice() {
	//动态数组，切片slice
	myArray := []int{1, 2, 3}
	fmt.Printf("myArray type is %T\n", myArray)
	printSlice(myArray)
	printSlice(myArray)

	//四种切片声明方式
	//声明并初始化，默认值为1，2，3，长度为3
	slice1 := []int{1, 2, 3}
	printSliceInfo(slice1)
	//声明与分配空间分离
	var slice2 []int
	slice2 = make([]int, 3)
	printSliceInfo(slice2)
	//声明与分配一起
	var slice3 []int = make([]int, 4)
	printSliceInfo(slice3)
	//判断slice是否为空
	var slice4 []int
	if slice4 == nil {
		fmt.Println("slice4 is nil")
	}
	//为切片指定长度与容量
	var slice5 []int = make([]int, 3, 5)
	printSliceInfo(slice5)
	//追加值,超过容量会自动扩容两倍
	slice5 = append(slice5, 1, 2, 3)
	printSliceInfo(slice5)

	//切片的截取,左闭右开，[:3],[4:],[:]
	//类似于引用
	slice6 := slice5[1:4]
	printSliceInfo(slice6)

	//深拷贝
	s2 := make([]int, 3)
	copy(s2, slice5)
	printSliceInfo(s2)
}
